package cn.qicaiwang.open.websocket.controller;

import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.util.StrUtil;
import cn.qicaiwang.open.common.constant.Constants;
import cn.qicaiwang.open.common.enums.ResultStatusCodeEnum;
import cn.qicaiwang.open.common.req.CrmMessageREQ;
import cn.qicaiwang.open.common.response.ResponseResult;
import cn.qicaiwang.open.common.utils.SecurityUtil;
import cn.qicaiwang.open.common.vo.CrmMessageVO;
import cn.qicaiwang.open.common.vo.CrmSessionVO;
import cn.qicaiwang.open.websocket.service.IChatContactService;
import cn.qicaiwang.open.websocket.service.ICrmMessageService;
import cn.qicaiwang.open.websocket.service.ICrmSessionService;
import cn.qicaiwang.open.websocket.vo.ChatContactVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**​
        * 聊天系统控制器
        */
@RestController
@RequestMapping("qcwapp/crm/chat")
public class ChatController {

    @Autowired
    private IChatContactService chatContactsService;  // 通讯录服务

    @Autowired
    private ICrmSessionService crmSessionService;  // 会话服务

    @Autowired
    private ICrmMessageService crmMessageService;  // 消息服务

    /**​
            * 获取通讯录树形结构
     * @param keywords 搜索关键词
     * @return 树形结构的通讯录
     */
    @GetMapping("contacts")
    public ResponseResult contacts(String keywords){
        // 1. 获取通讯录列表
        List<ChatContactVO> list = chatContactsService.contacts(keywords);

        // 2. 配置树形结构参数
        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
        treeNodeConfig.setWeightKey("name");  // 设置排序字段

        // 3. 构建树形结构
        List<Tree<String>> trees = TreeUtil.build(list, Constants.UNIT_ROOT_ID, treeNodeConfig, (treeNode, tree) -> {
            tree.setId(treeNode.getId());
            tree.setParentId(treeNode.getParentId());
            tree.setName(treeNode.getName());
            tree.setWeight(treeNode.getName());
            // 添加额外属性
            tree.putExtra("type", treeNode.getType());
            tree.putExtra("avatar", treeNode.getAvatar());
            tree.putExtra("gender", treeNode.getGender());
            tree.putExtra("email", treeNode.getEmail());
            tree.putExtra("mobile", treeNode.getMobile());
            tree.putExtra("realName", treeNode.getRealName());
        });

        return ResponseResult.ok(trees);
    }

    /**​
            * 获取用户会话列表（分页）
            * @param page 分页参数
     * @return 会话列表
     */
    @GetMapping("sessions")
    public ResponseResult session(Page page,String userId){
        // 获取当前用户ID

        // 查询分页会话列表
        Page<CrmSessionVO> sessions = crmSessionService.pagelist(page, userId);
        return ResponseResult.ok(sessions);
    }

    /**​
            * 检查/创建会话
     * @param fromUserId 发起方用户ID
     * @param toUserId 接收方用户ID
     * @return 会话信息
     */
    @GetMapping("session/{fromUserId}/{toUserId}")
    public ResponseResult session(@PathVariable String fromUserId, @PathVariable String toUserId){
        // 参数校验
        if(StrUtil.isBlank(fromUserId) || StrUtil.isBlank(toUserId)){
            return ResponseResult.error(ResultStatusCodeEnum.PARAM_REQUIRE_ERROR);
        }
        // 检查/创建会话
        CrmSessionVO sessions = crmSessionService.check(fromUserId, toUserId);
        return ResponseResult.ok(sessions);
    }

    /**​
            * 删除会话
     * @param id 会话ID
     * @return 操作结果
     */
    @GetMapping("session/delete/{id}")
    public ResponseResult delete(@PathVariable String id){
        if(StrUtil.isBlank(id)){
            return ResponseResult.error(ResultStatusCodeEnum.PARAM_REQUIRE_ERROR);
        }
        boolean b = crmSessionService.delete(id);
        return b ? ResponseResult.ok() : ResponseResult.error(ResultStatusCodeEnum.HTTP_ERROR);
    }

    /**​
            * 获取聊天记录
     * @param page 分页参数
     * @param req 查询条件
     * @return 消息列表
     */
    @GetMapping("history")
    public ResponseResult session(Page page, CrmMessageREQ req){
        if(StrUtil.isBlank(req.getSessionId())){
            return ResponseResult.error(ResultStatusCodeEnum.PARAM_REQUIRE_ERROR);
        }
        Page<CrmMessageVO> history = crmMessageService.pagelist(page, req);
        return ResponseResult.ok(history);
    }
}
